/**
 ******************************************************************************
 * @file           : stm32_vortex_flowmeter.c
 * @brief          : STM32涡街流量计示例
 ******************************************************************************
 * @attention
 *
 * 应用场景：涡街流量计抗晃动检测
 * 硬件：STM32F103 + 压电陶瓷传感器
 * 功能：过滤机械晃动干扰，只保留真实流量信号
 *
 ******************************************************************************
 */

#include "psv.h"
#include "stm32f1xx_hal.h"

/* 频率采集数据 */
typedef struct
{
    uint32_t raw_freq;          /* 原始频率（始终更新） */
    uint32_t filtered_freq;     /* PSV过滤后频率 */
    uint8_t signal_valid;       /* 信号有效标志 */
} FlowData_t;

static FlowData_t flow_data = {0};

/**
 * @brief   初始化流量计
 */
void flowmeter_init(void)
{
    /* 初始化PSV模块 */
    psv_init();
    
    /* 初始化定时器输入捕获 */
    /* ... 你的定时器配置代码 ... */
    
    printf("Flowmeter initialized\r\n");
}

/**
 * @brief   定时器捕获中断回调
 * @note    在捕获到脉冲时调用
 */
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
    static uint32_t last_capture = 0;
    uint32_t current_capture;
    uint32_t period;
    uint32_t freq;
    
    /* 读取捕获值 */
    current_capture = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
    
    /* 计算周期 */
    if (current_capture > last_capture)
    {
        period = current_capture - last_capture;
    }
    else
    {
        period = (0xFFFF - last_capture) + current_capture + 1;
    }
    last_capture = current_capture;
    
    /* 计算频率（假设定时器频率1MHz） */
    freq = 1000000 / period;
    
    /* 更新原始频率（始终显示） */
    flow_data.raw_freq = freq;
    
    /* PSV检测：检测到干扰则不更新滤波后的频率 */
    if (psv_check(freq))
    {
        flow_data.filtered_freq = freq;
        flow_data.signal_valid = 1;
    }
    else
    {
        /* 干扰信号，保持上次有效值 */
        flow_data.signal_valid = 0;
    }
}

/**
 * @brief   获取流量值
 * @retval  流量（L/min），如果信号无效返回0
 */
float get_flow_rate(void)
{
    if (flow_data.signal_valid)
    {
        /* 频率转流量：根据流量计K系数转换 */
        /* 示例：K=10，则 流量 = 频率 / 10 */
        return (float)flow_data.filtered_freq / 10.0f;
    }
    else
    {
        return 0.0f;  /* 信号无效，返回0 */
    }
}

/**
 * @brief   主循环任务
 */
void flowmeter_task(void)
{
    static uint32_t last_print_time = 0;
    uint32_t now = HAL_GetTick();
    
    /* 每500ms打印一次 */
    if (now - last_print_time > 500)
    {
        last_print_time = now;
        
        float flow_rate = get_flow_rate();
        
        printf("Raw Freq: %lu Hz, ", (unsigned long)flow_data.raw_freq);
        printf("Filtered Freq: %lu Hz, ", (unsigned long)flow_data.filtered_freq);
        printf("Flow Rate: %.2f L/min, ", flow_rate);
        printf("Valid: %s\r\n", flow_data.signal_valid ? "Yes" : "No");
        
        /* 可选：打印PSV统计信息 */
        #if 0
        PSV_Statistics_t stats;
        psv_get_statistics(&stats);
        printf("CV=%.3f, Locked=%d\r\n", stats.cv, stats.is_locked);
        #endif
    }
}

/**
 * @brief   超时检测
 * @note    定期调用，检测信号丢失
 */
void flowmeter_timeout_check(void)
{
    static uint32_t last_freq_update = 0;
    uint32_t now = HAL_GetTick();
    
    /* 假设上次有频率更新的时间 */
    /* 实际应用中需要在捕获回调中更新这个时间戳 */
    
    /* 如果超过500ms没有信号，复位PSV */
    if (now - last_freq_update > 500)
    {
        flow_data.signal_valid = 0;
        flow_data.filtered_freq = 0;
        psv_reset();
    }
}
